
// 封装实现一个sqlitehelper类，提供简单的sqlite数据库操作接口
// 完成数据的基础增删改查操作
// 1,创建，打开数据库文件 （一个数据库对应一个文件）
// 2,针对打开的数据库，执行操作  a,表的操作 b,数据的操作
// 3,关闭数据库
// 
#include <sqlite3.h>
#include <string>
#include <vector>
#include <iostream>

class SqliteHelper
{
public:
    //重命名的函数指针
    typedef int (*SqliteCallback)(void*, int, char**, char**);

    SqliteHelper(const std::string& dbfile) 
        :_dbfile(dbfile),_handler(nullptr)
    {}

    //打开数据库, 默认的安全等级是串行化
    bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX)
    {                         //   打开的文件         //句柄           //安全
        //int sqlite3_open_v2(const char* filename, sqlite3** ppDbm, int flags, const char* zVfs);
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_leve, nullptr);
        if(ret != SQLITE_OK)
        {
            std::cout << "打开sqlite数据库失败" << std::endl;
            return false;
        }

        return true;
    }

    //执行语句
    bool exec(const std::string& sql, SqliteCallback cb, void* arg)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
        if(ret != SQLITE_OK)
        {
            std::cout << sql << std::endl;
            std::cout << "执行语句失败" << std::endl;
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    } 

    void close()
    {
        if(_handler)
            sqlite3_close_v2(_handler);
    }
    
private:
    std::string _dbfile;
    sqlite3* _handler; //句柄
};